3-way handshake
3-way handshake
1. 개요
3-way handshake는 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 기반의 네트워크 통신에서 클라이언트와 서버가 데이터를 주고받기 전, 서로의 연결 가능 상태를 확인하고 동기화하기 위해 수행하는 세 단계의 연결 설정 과정이다.
TCP는 연결 지향적(Connection-oriented) 프로토콜로, 데이터 전송 전 양 끝단(End-to-End)의 논리적인 연결 통로를 먼저 생성해야 한다. 3-way handshake는 양측의 시퀀스 번호를 동기화하고, 송수신 준비가 되었음을 확인하여 데이터 전송의 신뢰성을 보장하는 핵심 메커니즘이다.
2. 동작 원리 및 단계
3-way handshake는 SYN(Synchronize)과 ACK(Acknowledgment) 패킷을 세 번 교환하며 진행된다.
2.1 단계별 상세 과정
- Step 1: SYN (Synchronize Packet)
- 클라이언트가 서버에 연결을 요청하며 SYN 패킷을 전송한다.
- 이때 클라이언트는 임의의 초기 시퀀스 번호(ISN, Initial Sequence Number)를 생성하여 함께 보낸다.
-
상태 변화:
CLOSED$\rightarrow$SYN_SENT -
Step 2: SYN-ACK (Synchronize-Acknowledgment Packet)
- 서버는 클라이언트의 요청을 받고, 연결을 수락한다는 의미의 SYN 패킷과 요청에 대한 응답인 ACK 패킷을 동시에 보낸다.
- 서버 역시 자신의 ISN을 생성하며, ACK 번호로는 클라이언트가 보낸 시퀀스 번호에 1을 더한 값을 설정한다.
-
상태 변화:
LISTEN$\rightarrow$SYN_RECEIVED -
Step 3: ACK (Acknowledgment Packet)
- 클라이언트는 서버의 응답을 확인하고, 마지막으로 ACK 패킷을 전송한다.
- ACK 번호는 서버가 보낸 시퀀스 번호에 1을 더한 값으로 설정한다.
- 상태 변화:
SYN_SENT$\rightarrow$ESTABLISHED(서버 또한 이 패킷을 받으면ESTABLISHED상태가 됨)
2.2 단계별 요약 표
| 단계 | 패킷 종류 | 송신자 $\rightarrow$ 수신자 | 주요 목적 | 클라이언트 상태 | 서버 상태 |
|---|---|---|---|---|---|
| 1 | SYN | Client $\rightarrow$ Server | 연결 요청 및 ISN 동기화 | SYN_SENT |
LISTEN $\rightarrow$ SYN_RECEIVED |
| 2 | SYN-ACK | Server $\rightarrow$ Client | 요청 수락 및 서버 ISN 동기화 | SYN_SENT |
SYN_RECEIVED |
| 3 | ACK | Client $\rightarrow$ Server | 최종 연결 확인 | ESTABLISHED |
ESTABLISHED |
2.3 시퀀스 다이어그램
sequenceDiagram
participant Client
participant Server
Note over Client, Server: [TCP Connection Establishment]
Client->>Server: SYN (Seq=x)
Note right of Client: State: SYN_SENT
Server->>Client: SYN (Seq=y), ACK (Ack=x+1)
Note right of Server: State: SYN_RECEIVED
Client->>Server: ACK (Ack=y+1)
Note right of Client: State: ESTABLISHED
Note right of Server: State: ESTABLISHED
3. 주요 제어 플래그와 시퀀스 번호
3.1 TCP 제어 플래그 (Control Flags)
TCP 헤더에는 패킷의 성격을 규정하는 플래그 비트가 존재한다. - SYN (Synchronize): 연결 설정 시 시퀀스 번호를 동기화하기 위해 사용한다. - ACK (Acknowledgment): 상대방으로부터 패킷을 성공적으로 수신했음을 알릴 때 사용한다.
3.2 시퀀스 번호 (Sequence Number)와 ACK 번호
- 시퀀스 번호 (Seq): 전송하는 데이터 바이트의 순서를 나타내는 번호이다. 이를 통해 수신 측은 쪼개져 들어온 패킷을 원래 순서대로 재조립할 수 있으며, 누락된 패킷이 있는지 확인한다.
- 초기 시퀀스 번호 (ISN): 매 연결마다 무작위로 생성되는 시작 번호이다. 만약 고정된 번호를 사용한다면, 이전 연결에서 지연되었던 패킷이 현재 연결의 데이터로 오인되는 '패킷 혼선' 문제가 발생할 수 있다.
- ACK 번호: "다음으로 기대하는 시퀀스 번호"를 의미한다. 기본적으로
ACK = 수신한 Seq + 데이터 길이로 계산된다. - 중요: 3-way handshake 과정에서는 실제 데이터(Payload)가 없지만, SYN과 FIN 플래그는 논리적으로 1바이트의 시퀀스 번호를 소비한다. 따라서 데이터가 없더라도 ACK 번호를 계산할 때
+1을 수행한다.
4. 연결 설정 실패 및 예외 상황
4.1 패킷 손실 및 재전송
- SYN 유실: 클라이언트가 보낸 SYN 패킷이 유실되면 서버는 응답하지 않는다. 클라이언트는 재전송 타이머(Retransmission Timer)가 만료될 때까지 기다린 후 SYN 패킷을 다시 전송한다.
- SYN-ACK 유실: 서버의 응답이 유실되면 클라이언트는 다시 SYN을 보내며, 서버 또한 일정 시간 후 SYN-ACK를 재전송한다.
4.2 보안 취약점: SYN Flooding
SYN Flooding은 공격자가 수많은 SYN 패킷을 보내 서버의 연결 큐(Backlog Queue)를 가득 채워, 정상적인 사용자의 연결 요청을 거부하게 만드는 DoS(Denial of Service) 공격이다. - 방어 기법 (SYN Cookie): 서버가 SYN 패킷을 받았을 때 즉시 상태 정보를 연결 큐(Backlog Queue)에 저장하지 않고, 시퀀스 번호 자체에 연결 정보를 암호화하여 담아 보내는 방식이다. 클라이언트가 올바른 ACK를 보내왔을 때만 상태를 생성하므로 메모리 고갈을 방지할 수 있다.
5. 최신 최적화 기술: TCP Fast Open (TFO)
전통적인 3-way handshake는 실제 데이터를 주고받기 전 1.5 RTT(Round Trip Time)의 지연 시간이 발생한다. 이를 최적화하기 위해 TCP Fast Open (TFO) 기술이 도입되었다.
- 작동 원리: 최초 연결 시 서버로부터 TFO 쿠키를 발급받아 저장해둔다. 이후 재연결 시, 클라이언트는 SYN 패킷에 이 쿠키와 함께 실제 데이터(Payload)를 함께 실어 보낸다.
- 효과: 서버는 쿠키를 통해 신뢰할 수 있는 클라이언트임을 확인하면, 3-way handshake가 완전히 끝나기 전이라도 데이터를 즉시 처리하여 응답할 수 있어 지연 시간을 획기적으로 줄인다.
6. Wireshark 패킷 캡처 분석 사례
실제 네트워크 패킷 분석 도구인 Wireshark를 통해 3-way handshake를 관찰하면 다음과 같은 흐름이 나타난다.
| No. | Source $\rightarrow$ Destination | Protocol | Info | 분석 내용 |
|---|---|---|---|---|
| 1 | $192.168.0.10 \rightarrow 1.1.1.1$ | TCP | $54321 \rightarrow 80$ [SYN] Seq=0 | 클라이언트가 포트 80(HTTP)으로 연결 요청 |
| 2 | $1.1.1.1 \rightarrow 192.168.0.10$ | TCP | $80 \rightarrow 54321$ [SYN, ACK] Seq=0 Ack=1 | 서버가 요청 수락 및 자신의 Seq 전송 (Ack=1은 클라이언트 Seq 0+1) |
| 3 | $192.168.0.10 \rightarrow 1.1.1.1$ | TCP | $54321 \rightarrow 80$ [ACK] Seq=1 Ack=1 | 클라이언트 최종 확인 (Seq=1은 자신의 SYN 소비 결과, Ack=1은 서버 Seq 0+1) |
※ 실제 캡처 시 Seq 번호는 0이 아닌 매우 큰 무작위 숫자로 표시되나, Wireshark의 'Relative Sequence Numbers' 옵션을 켜면 위와 같이 0부터 시작하는 상대 번호로 표시되어 분석이 용이하다.
7. 요약 및 비교
7.1 전체 흐름 요약
Client (SYN) $\rightarrow$ Server (SYN-ACK) $\rightarrow$ Client (ACK) $\rightarrow$ 연결 성립(Established)
7.2 3-way vs 4-way Handshake 비교
연결 설정(3-way)과 연결 해제(4-way)는 목적과 과정에서 뚜렷한 차이가 있다.
| 구분 | 3-way Handshake | 4-way Handshake |
|---|---|---|
| 목적 | 연결 설정 (Connection Establishment) | 연결 해제 (Connection Termination) |
| 주요 플래그 | SYN, ACK | FIN, ACK |
| 단계 수 | 3단계 | 4단계 |
| 특징 | 양방향 동기화가 동시에 이루어짐 | 각 방향의 연결을 개별적으로 종료해야 함 |
| 종료 상태 | ESTABLISHED |
CLOSED |
| 핵심 차이 | 빠르게 연결하는 것이 중요 | 전송 중인 데이터를 모두 처리한 후 종료해야 함 |
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.